package com.qcl.utils.bastDao;

import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

@Service
public interface JPABaseDAO<T,ID extends Serializable>{
    /**
     * 保存数据对象
     * @param entity
     * @return
     */
    boolean save(T entity);
    /**
     * 根据id查询
     * @param integer
     * @param t
     * @return
     */
    T findByid(Class<T> t,Integer integer);

    /**
     * 多个参数的HQL查询
     * hql 是这样写的 from Student where sname=?1 and age>?2
     * @param hql语句
     * @param param 是参数列表
     * @return  是类型T
     */
    public List<T> findByHQL(String hql, List<Object> param);

    /**
     * 多个参数的SQL查询
     * sql 是这样写的 select * from student where sname=?1 and age>?2
     * @param sql 语句
     * @param map param 是参数列表
     * @return 是类型T
     */
    public List<Object> findBySQL(String sql, List<Object> param);

    /**
     * sql 是这样写的 select * from student where sname=:n and age>:a
     *
     * @param sql
     * @param map
     * @return map列表分个map
     */
    public List<Map> findBySQLMAP(String sql, Map<String,Object> paramMap);

    /**
     * 多字段查询分页
     * @param tablename 表名
     * @param map 以map存储key,value
     * @param start 第几页
     * @param pageNumer 一个页面的条数
     * @return
     */
    List<T> findByMoreFiledpages(String tablename, LinkedHashMap<String,Object> map, int start, int pageNumer);

    /**
     * 根据表的id删除数据
     * @param  entity
     */
    boolean delete(T entity);
    /**
     * 更新对象
     * @param e
     * @return
     */
    boolean update(T e);
    /**
     * 根据传入的map遍历key,value拼接字符串，以id为条件更新
     * @param tablename 表名
     * @param map 传入参数放入map中
     * @return
     */
    Integer updateMoreFiled(String tablename,LinkedHashMap<String,Object> map);


    /**
     * 根据条件查询总条数返回object类型
     * @param tablename  表名
     * @param map 传入参数放入map中
     * @return
     */
    Object findCount(String tablename, LinkedHashMap<String,Object> map);



    /**
     * 添加或者修改数据
     * @param tablename  表名
     * @param map 传入参数放入map中
     * @return
     */
    boolean merge(Object entity);
    /**
     *
     * @param sql
     * @return
     */
    boolean createSQLQuery(String sql);

    /**
     * 多个命名参数的HQL查询
     * hql 是这样写的 from Student where sname=:name and age>:age
     * @param hql语句
     * @param param 是命名参数map
     * @return  是类型T
     */
    public List<T> findByHQLByNameParam(String hql, Map<String, Object> maps);
}
